package com.example.demo;

import com.example.common.AjaxJson;
import org.springframework.stereotype.Service;
import cn.hutool.core.lang.Console;
import cn.hutool.poi.excel.ExcelUtil;
import cn.hutool.poi.excel.sax.handler.RowHandler;
import com.example.bean.Aj;
import com.example.bean.Jn;
import com.example.common.FileUtil;
import org.springframework.util.CollectionUtils;

import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

@Service
public class ZhiService {
     ArrayList<Aj> ajList = new ArrayList<Aj>();
     ArrayList<Jn> jnList = new ArrayList<Jn>();
    /**
     * 读取大数据量的Excel,
     * 请注意看下，官方代码有问题 int rowIndex 改为 long rowIndex 就好了
     */

    public AjaxJson ExcelUtil4(String exelPath,String path,Integer type){
        AjaxJson ajaxJson = new AjaxJson();
        ajList.clear();
        jnList.clear();
        ExcelUtil.readBySax(exelPath, 0, createRowHandler1());
        ExcelUtil.readBySax(exelPath, 1, createRowHandler2());
        String zhijian = zhijian(ajList,jnList,path,type);
        ajaxJson.put("list",zhijian);
        return new AjaxJson();
    }
    public String  zhijian(ArrayList<Aj> ajList,ArrayList<Jn> jnList,String path, Integer type){
        StringBuilder sb = new StringBuilder();
        int i = 0;
        for (Aj aj : ajList) {
            String fileNumber = aj.getFileNumber();
//            String title = aj.getTitle();
            String fondsNo = aj.getFondsNo();
//            if (!isValidString(title)){
//                FileUtil.appendLineToFile(path+File.separator+"检测.txt","案卷第"+aj.getRowIndex()+"行:"+title +" :题名包含特殊字符 ! ");
//                sb.append("案卷第"+aj.getRowIndex()+"行:"+title +" :题名包含特殊字符 ! ");
//            }
            if (!isValidDateFormat(aj.getStartDate())){
                FileUtil.appendLineToFile(path+File.separator+"检测.txt","案卷第"+aj.getRowIndex()+"行"+" 文件开始时间格式错误! ");
                sb.append("案卷第"+aj.getRowIndex()+"行"+" 文件开始时间格式错误! ");
            }
            if (!isValidDateFormat(aj.getEndDate())){
                FileUtil.appendLineToFile(path+File.separator+"检测.txt","卷内第"+aj.getRowIndex()+"行"+" 文件结束时间错误! ");
                sb.append("卷内第"+aj.getRowIndex()+"行"+" 文件结束时间错误! ");
            }
            Integer page = 0;
            Integer total = 0;
            try {
                page = Integer.parseInt(aj.getPage());
            } catch (NumberFormatException e) {
                FileUtil.appendLineToFile(path+File.separator+"检测.txt","案卷第"+aj.getRowIndex()+"行"+" 页码格式错误 ");
                sb.append("案卷第"+aj.getRowIndex()+"行"+" 页码格式错误 ");
            }
            try {
                total = Integer.parseInt(aj.getTotal());
            } catch (NumberFormatException e) {
                FileUtil.appendLineToFile(path+File.separator+"检测.txt","案卷第"+aj.getRowIndex()+"行"+" 总件数格式错误 ");
                sb.append("案卷第"+aj.getRowIndex()+"行"+" 总件数格式错误 ");
            }

            if (!CollectionUtils.isEmpty(jnList)){
                Integer count = 0;
                Integer countTotal = 0;
                int j = 0;
                for ( ; i < jnList.size(); i++) {
                    if (fileNumber.equals(jnList.get(i).getFileNumber())){
                        j++;
                        String archival = jnList.get(i).getArchival();
                        String s = extractSubstring(archival);
                        String fileNumber1 = jnList.get(i).getFileNumber();
//                        String title1 = jnList.get(i).getTitle();
                        //是否检测原文
                        if (type.equals(1)){
                            String filePath = path+File.separator+fondsNo+File.separator+fileNumber+File.separator+archival;
                            File file = new File(filePath);
                            if (!Files.exists(Paths.get(filePath))){
                                sb.append("案卷第"+aj.getRowIndex()+"行"+" 文件夹路径不存在 : "+filePath + "档号为: "+archival);
                                FileUtil.appendLineToFile(path+File.separator+"检测.txt", "案卷第"+aj.getRowIndex()+"行"+" 文件夹路径不存在 : "+filePath);
                            }else {
                                int wj=file.listFiles().length;
                                Integer number = null;
                                try {
                                    number = Integer.parseInt(jnList.get(i).getNumber());
                                } catch (NumberFormatException e) {
                                    FileUtil.appendLineToFile(path+File.separator+"检测.txt", "卷内第"+jnList.get(i).getRowIndex()+"行"+" 页数格式不对 ");
                                }
                                if (wj != number){
                                    FileUtil.appendLineToFile(path+File.separator+"检测.txt", "卷内第"+jnList.get(i).getRowIndex()+"行"+" 文件夹中图片数量和exec页数不一致 文件数量是"+wj + "execl数量是: "+ number + "档号为: "+archival);
                                    sb.append("案卷第"+aj.getRowIndex()+"行"+" 文件夹中图片数量和exec页数不一致 ");
                                }
                            }
                        }

//                        if (!isValidString(title1)) {
//                            FileUtil.appendLineToFile(path+File.separator+"检测.txt", "卷内第"+jnList.get(i).getRowIndex()+"行: "+title1 + " 题名包含特殊字符! ");
//                            sb.append("卷内第"+jnList.get(i).getRowIndex()+"行: "+title1 + " 题名包含特殊字符! ");
//                        }
                        if (!isValidDateFormat(jnList.get(i).getCreateDate())){
                            FileUtil.appendLineToFile(path+File.separator+"检测.txt", "卷内第"+jnList.get(i).getRowIndex()+"行"+" 文件形成时间格式错误! ");
                            sb.append("卷内第"+jnList.get(i).getRowIndex()+"行"+" 文件形成时间格式错误! ");
                        }
                        if (!fileNumber1.equals(s)){
                            FileUtil.appendLineToFile(path+File.separator+"检测.txt", "卷内第"+jnList.get(i).getRowIndex()+"行"+" 案卷号和档号不配备！ " + "档号是: "+ archival+ " 案卷档号是: "+ fileNumber1);
                            sb.append("卷内第"+jnList.get(i).getRowIndex()+"行"+" 案卷号和档号不配备！ ");
                        }
                        int i1 = extractAndParse(archival);
                        try {
                            Integer number = Integer.parseInt(jnList.get(i).getNumber());
                            count += number;
                        } catch (NumberFormatException e) {
                            FileUtil.appendLineToFile(path+File.separator+"检测.txt", "卷内第"+jnList.get(i).getRowIndex()+"行"+" 页数格式错误！ ");
                            sb.append("卷内第"+jnList.get(i).getRowIndex()+"行"+" 页数格式错误！ ");
                        }
                        //起页号 || //止页号 || 页数
                        try {
                            Integer from = Integer.parseInt(jnList.get(i).getFromPage());
                            Integer stop = Integer.parseInt(jnList.get(i).getStopPage());
                            Integer number = Integer.parseInt(jnList.get(i).getNumber());
                            Integer hh =stop-from+1;
                            if (!number.equals(hh)){
                                FileUtil.appendLineToFile(path+File.separator+"检测.txt", "卷内第"+jnList.get(i).getRowIndex()+"行"+" 止页号 - 起页号 ！= 页数 " + " 档号为：" +archival + " 止页号为: " +stop + "起页号为："+ from + "页数为 :"+ hh);
                                sb.append("卷内第"+jnList.get(i).getRowIndex()+"行"+" 止页号 - 起页号 ！= 页数 ");
                            }
                        } catch (NumberFormatException e) {
                            FileUtil.appendLineToFile(path+File.separator+"检测.txt", "卷内第"+jnList.get(i).getRowIndex()+"行"+" 起页号，止页号 ,页数 中格式有错误！ ");
                            sb.append("卷内第"+jnList.get(i).getRowIndex()+"行"+" 起页号，止页号 ,页数 中格式有错误！ ");
                        }
                        try {
                            Integer serial = Integer.parseInt(jnList.get(i).getSerial());
                            if (!serial.equals(i1)){
                                FileUtil.appendLineToFile(path+File.separator+"检测.txt", "卷内第"+jnList.get(i).getRowIndex()+"行"+" 顺序号和档案末尾不等！ " + "档号为: "+ archival);
                                sb.append("卷内第"+jnList.get(i).getRowIndex()+"行"+" 顺序号和档案末尾不等！ ");
                            }
                        } catch (NumberFormatException e) {
                            FileUtil.appendLineToFile(path+File.separator+"检测.txt", "卷内第"+jnList.get(i).getRowIndex()+"行"+" 页数格式错误！ ");
                            sb.append("卷内第"+jnList.get(i).getRowIndex()+"行"+" 页数格式错误！ ");
                        }

                    }else {
                        //检测原文开关
                        if (type.equals(1)){
                            // 判断文件夹数量是否正确
                            String path1 = path+ File.separator+fondsNo+File.separator+fileNumber;
                            File file = new File(path1);
                            if (!Files.exists(Paths.get(path1))){
                                sb.append("案卷第"+aj.getRowIndex()+"行"+" 文件夹路径不存在 ："+path1);
                                FileUtil.appendLineToFile(path+File.separator+"检测.txt", "案卷第"+aj.getRowIndex()+"行"+" 文件夹路径不存在 ："+path1 );
                            }else {
                                int wj=file.listFiles().length;
                                boolean jpg = file.listFiles()[0].getName().contains("jpg");
                                if (jpg){
                                    FileUtil.appendLineToFile(path+File.separator+"检测.txt", "该路径下存在图片：  "+path1 +"案卷档号为: "+fileNumber);
                                }
                                if (wj != j){
                                    sb.append("案卷第"+aj.getRowIndex()+"行"+" 文件夹案卷数量和exec中数量不一致");
                                    FileUtil.appendLineToFile(path+File.separator+"检测.txt", "案卷第"+aj.getRowIndex()+"行"+" 文件夹案卷数量和exec中数量不一致"+ " 案卷档号为: "+fileNumber);
                                }
                            }
                        }

                        if (!total.equals(j)){
                            if (!total.equals(countTotal)){
                                FileUtil.appendLineToFile(path+File.separator+"检测.txt", "案卷第"+aj.getRowIndex()+"行"+" 总件数与卷内页数总和不一致！ "+ " 案卷档号为: "+fileNumber);
                                sb.append("案卷第"+aj.getRowIndex()+"行"+" 总件数与卷内页数总和不一致！ ");
                            }
                        }
                        if (!page.equals(count)){
                            FileUtil.appendLineToFile(path+File.separator+"检测.txt", "案卷第"+aj.getRowIndex()+"行"+" 页数与卷内页数总和不一致！ " +" 案卷档号为: "+fileNumber);
                            sb.append("案卷第"+aj.getRowIndex()+"行"+" 页数与卷内页数总和不一致！ ");
                        }
                        count =0;
                        j = 0;
                        break;
                    }
                }
                if (j !=0){
                    if (type.equals(1)){
                        // 判断文件夹数量是否正确
                        String path1 = path+ File.separator+fondsNo+File.separator+fileNumber;
                        File file = new File(path1);
                        if (!Files.exists(Paths.get(path1))){
                            FileUtil.appendLineToFile(path+File.separator+"检测.txt", "案卷第"+aj.getRowIndex()+"行"+" 文件夹路径不存在 "+" 案卷档号为: "+fileNumber);
                            sb.append("案卷第"+aj.getRowIndex()+"行"+" 文件夹路径不存在 ");
                        }else {
                            int wj=file.listFiles().length;
                            boolean jpg = file.listFiles()[0].getName().contains("jpg");
                            if (jpg){
                                FileUtil.appendLineToFile(path+File.separator+"检测.txt", "该路径下存在图片 : "+path1 +" 案卷档号为: "+fileNumber);
                            }
                            if (wj != j){
                                FileUtil.appendLineToFile(path+File.separator+"检测.txt", "案卷第"+aj.getRowIndex()+"行"+" 文件夹案卷数量和exec中数量不一致 " + " 案卷档号为: "+fileNumber);
                                sb.append("案卷第"+aj.getRowIndex()+"行"+" 文件夹案卷数量和exec中数量不一致 ");
                            }
                        }
                    }
                    if (!total.equals(j)){
                        FileUtil.appendLineToFile(path+File.separator+"检测.txt", "案卷第"+aj.getRowIndex()+"行"+" 总件数与卷内页数总和不一致！ " +"案卷档号为: "+aj.getFileNumber());
                        sb.append("案卷第"+aj.getRowIndex()+"行"+" 总件数与卷内页数总和不一致！ ");
                    }
                    if (!page.equals(count)){
                        FileUtil.appendLineToFile(path+File.separator+"检测.txt", "案卷第"+aj.getRowIndex()+"行"+" 页数与卷内页数总和不一致！ " +"案卷档号为: "+aj.getFileNumber());
                        sb.append("案卷第"+aj.getRowIndex()+"行"+" 页数与卷内页数总和不一致！ ");
                    }
                }
            }

        }
        return sb.toString();
    }

    private  int extractAndParse(String input) {
        // 使用substring方法获取最后一个-后面的字符串
        String lastPart = input.substring(input.lastIndexOf('-') + 1);

        // 使用parseInt方法将字符串转换为整数
        return Integer.parseInt(lastPart);
    }

    private static String extractSubstring(String input) {
        // 使用lastIndexOf方法找到最后一个减号的索引
        int lastIndex = input.lastIndexOf("-");

        // 使用substring方法截取字符串
        return input.substring(0, lastIndex);
    }

    private  boolean isValidDateFormat(String input) {
        // 使用正则表达式匹配 [20230709] 或 20231204 格式
        String regex = "^\\[(\\d{8})\\]$|^\\d{8}$";
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(input);
        return matcher.matches();
    }

    private static boolean isValidString(String input) {
        // 使用正则表达式匹配只包含中文、数字、字母、顿号（、）、括号（()）、方括号（[]）、逗号（,）和句号（。）的字符串
        String regex = "^[\\u4e00-\\u9fa5a-zA-Z0-9，（）&#8203;``【oaicite:1】``&#8203;、,。]*$";
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(input);
        return matcher.matches();
    }

    public RowHandler createRowHandler1() {
        return new RowHandler() {
            @Override
            public void handle(int sheetIndex, long rowIndex, List<Object> rowlist) {
//                Console.log("[{}] [{}] {}", sheetIndex, rowIndex, rowlist);
                if (rowIndex>0  && rowlist !=null){
                    Aj aj = new Aj();
                    aj.setRowIndex((int) rowIndex+1);
                    aj.setFondsNo(rowlist.get(0).toString());
                    aj.setFileNumber(rowlist.get(1).toString());
                    aj.setTitle(rowlist.get(2).toString());
                    aj.setStartDate(rowlist.get(3).toString());
                    aj.setEndDate(rowlist.get(4).toString());
                    aj.setPage(rowlist.get(5).toString());
                    aj.setTotal(rowlist.get(6).toString());
                    aj.setSerial(rowlist.get(7).toString());
//                    aj.setSecurity(rowlist.get(8).toString());
                    ajList.add(aj);
                }
            }
        };
    }
    public  RowHandler createRowHandler2() {
        return new RowHandler() {
            @Override
            public void handle(int sheetIndex, long rowIndex, List<Object> rowlist) {
//                Console.log("[{}] [{}] {}", sheetIndex, rowIndex, rowlist);
                if (rowIndex>0  && rowlist !=null){
                    Jn jn = new Jn();
                    jn.setRowIndex((int)rowIndex+1);
                    jn.setFondsNo(rowlist.get(0).toString());
                    jn.setFileNumber(rowlist.get(1).toString());
                    jn.setArchival(rowlist.get(2).toString());
//                    jn.setDocument(rowlist.get(3).toString());
                    jn.setTitle(rowlist.get(3).toString());
                    jn.setCreateDate(rowlist.get(4).toString());
                    jn.setFromPage(rowlist.get(5).toString());
                    jn.setStopPage(rowlist.get(6).toString());
                    jn.setNumber(rowlist.get(7).toString());
                    jn.setSerial(rowlist.get(8).toString());
//                    jn.setSecurity(rowlist.get(10).toString());
                    jnList.add(jn);
                }
            }
        };
    }
}

